package com.example.demo.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

@Controller
public class ExcelUploadController {

//    @RequestMapping(value = "/upload",method = RequestMethod.POST)
//    @ResponseBody
//    public Object upload(Model model,MultipartFile file) {
//        String fileName = file.getOriginalFilename();
//
//        System.out.println("====>文件名：" + fileName);
//
//        // 1.--------------------校验参数
//        //判断是否为null
//        if (null == file) {
//            return null;
//        }
//        //todo 判断是否为Excel格式
//
//        //判断内容是否为空
//        long size = file.getSize();
//        if (0 == size) {
//            return null;
//        }
//
//        // 2.--------------------模拟将将文件上传至服务器
//        String newFileName = saveFile(file);
//
//        // 3. -------------------将数据填充至template页面
//
//        // 得到Workbook（工作簿对象（含有至少一个sheet页），最外层的对象）
//        Workbook wb = null;
//        try {
//            // 这里就是得到file文件对象的字节码，塞到XSSFWorkbook中
//            wb = new XSSFWorkbook(file.getInputStream());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        // 将excel转为集合List,excel每一行相当于一个map
//        List<Map<String, Object>> dataList = readExcel(wb);
//        System.out.println("=======>处理完毕，符合条件数据有：" + dataList.size() + "条");
//
//        // todo 将数据存库
//        // 跳转页面
//        return dataList;
//    }

    private String saveFile(MultipartFile file,String basePath) {
        // 文件名
        String fileName = file.getOriginalFilename();
        InputStream inputStream = null;
        FileOutputStream fileOut = null;
        try {
            inputStream = file.getInputStream();
            fileOut = new FileOutputStream(basePath+fileName);//这里可以改路径
            IOUtils.copy(inputStream, fileOut);
            fileOut.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (fileOut != null) {
                    fileOut.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return basePath + fileName;
    }

//    // excel标题
//    private List<String> titles = Arrays.asList("序号","姓名","年龄");
//
//    // 将工作簿对象转为java集合
//    private List<Map<String, Object>> readExcel(Workbook workbook) {
//        //初始化返回对象
//        List<Map<String, Object>> dataList = new ArrayList<>();
//        //workbook获取第一个sheet
//        Sheet sheet0 = workbook.getSheetAt(0);
//        //第一个sheet页的总行数
//        int totalRows = sheet0.getPhysicalNumberOfRows();
//        // 对每一行进行遍历，第一行是标题从第二行开始算
//        for (int i = 1; i < totalRows; i++) {
//            // 取到当前excel的行对象
//            Row row = sheet0.getRow(i);
//            // 初始化对应的map作为java当前行对象
//            Map<String,Object> map = new HashMap<>();
//            // 转换对象
//            if(null == row){
//                System.out.println("===========>第"+i+"行数据有问题，请核查数据！");
//            }
//            map.put(titles.get(0),row.getCell(0).toString());
//            map.put(titles.get(1),row.getCell(1).toString());
//            map.put(titles.get(2),row.getCell(2).toString());
//            dataList.add(map);
//        }
//        return dataList;
//    }

    // 文件目录
    private String baseUrl = "D://";
    /**
     * 上传文件，返回名称地址
     * @param file 文件对象
     * @return
     */
    @RequestMapping("/uploadExcel")
    @ResponseBody
    public Map uploadExcel(MultipartFile file) {
        if (file == null) {
            System.out.println("文件对象不能为空");
        }
        String fileName = file.getOriginalFilename();
        System.out.println("====>文件名：" + fileName);

        // 保存文件
        String url = saveFile(file,baseUrl);
        // 返回文件地址，如"D://text.excel"
        System.out.println(url);
        Map map = new HashMap();
        map.put("url",url);
        return map;
    }

    @RequestMapping(value = "/getHtml")
    @ResponseBody
    public Map getHtml(@RequestBody String  jsonString) {
        JSONObject object = JSONObject.parseObject(jsonString);
        String excelUrl = object.getString("excelUrl");
        System.out.println("文件路径："+excelUrl);
        // 根据文件地址找出磁盘中的excel文件
        String htmlString;
        try {
            htmlString = Excel2HtmlUtil.readExcelToHtml(excelUrl, false, excelUrl);
        } catch (Exception e) {
            System.out.println("错误");
            return null;
        }
        Map map = new HashMap();
        map.put("html",htmlString);
        return map;

    }

}
